// 242. 有效的字母异位词
// 给定两个字符串 s 和 t ，编写一个函数来判断 t 是否是 s 的字母异位词。

// 注意：若 s 和 t 中每个字符出现的次数都相同，则称 s 和 t 互为字母异位词。
// 输入: s = "anagram", t = "nagaram"
// 输出: true

// 思路：t 是 s 的异位词等价于「两个字符串中字符出现的种类和次数均相等」。
// 由于字符串只包含 26 个小写字母，因此我们可以维护一个长度为 26 的频次数组table，
// 先遍历记录字符串 s 中字符出现的频次，然后遍历字符串 t，减去table 中对应的频次，
// 如果出现 table[i]<0，则说明 t 包含一个不在 s 中的额外字符，返回 false 即可。

// charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。
// 这个返回值是 0 - 65535 之间的整数。
/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
 var isAnagram = function(s, t) {
    if(s.length!=t.length){
        return false;
    }
    const table=new Array(26).fill(0);
    for(let i in s){
        table[s.charCodeAt(i)-'a'.charCodeAt(0)]++;
    }
    for(let j in t){
        table[t.charCodeAt(j)-'a'.charCodeAt(0)]--;
        if(table[t.charCodeAt(j)-'a'.charCodeAt(0)]<0){
            return false;
        }
    }
    return true;
};

// 383.赎金信
// 给你两个字符串：ransomNote 和 magazine ，
// 判断 ransomNote 能不能由 magazine 里面的字符构成。

// 如果可以，返回 true ；否则返回 false 。

// magazine 中的每个字符只能在 ransomNote 中使用一次。

// 49. 字母异位词分组
// 给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
/**
 * @param {string[]} strs
 * @return {string[][]}
 */
 var groupAnagrams = function(strs) {
    let map=new Map();
    for(let i=0;i<strs.length;i++){
        let str=strs[i].split('').sort().join();//拆分字符串
        if(map.has(str)){
           let temp=map.get(str);
           temp.push(strs[i]);
           map.set(str,temp); 
        }else{
            map.set(str,[strs[i]]);
        }
    }
    return [...map.values()];
};